package com.ck.company.service;

import com.ck.exception.ServiceException;
import com.ck.model.chuangke.vo.CkProgramListVO;
import com.ck.model.common.Program;
import com.ck.model.common.sys.LoginUser;
import com.ck.model.company.dto.CpProgramDTO;
import com.ck.model.company.vo.*;
import com.github.pagehelper.Page;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 商家节目
 *
 * @author linqiang
 * @date 2018-06-20 18:21
 */
public interface CpProgramService {

    /**
     * 商家节目列表分页查询
     *
     * @param companyCode   商家编号
     * @param programName   节目名称
     * @param programStatus 节目状态
     * @param pageNum       当前页
     * @param pageSize      每页条数
     * @return page
     */
    Page<CpProgramListVO> listByPage(String companyCode, String programName, Integer programStatus, Integer pageNum,
                                     Integer pageSize);

    /**
     * 商家某节目终端列表分页查询
     *
     * @param companyCode    商家编号
     * @param programVersion 节目版本号
     * @param deviceCode     终端机器码
     * @param pageNum        当前页
     * @param pageSize       每页条数
     * @return Page<CpProgramDeviceListVO>
     */
    Page<CpProgramDeviceListVO> listProgramDeviceByPage(String companyCode, String programVersion, String deviceCode,
                                                        Integer pageNum, Integer pageSize);

    /**
     * 商家节目的终端下载统计
     *
     * @param companyCode    商家编号
     * @param programVersion 节目版本号
     * @param deviceCode     终端序列号
     * @return CpProgramDeviceCountVO
     */
    CpProgramDeviceCountVO getProgramDeviceCount(String companyCode, String programVersion, String deviceCode);

    /**
     * 修改节目状态
     *
     * @param programId     节目主键
     * @param programStatus 节目状态
     * @param updateTime    修改时间
     * @param request       请求
     * @return 影响行数
     * @throws ServiceException
     */
    int updateProgramStatus(Long programId, Integer programStatus, Long updateTime, HttpServletRequest request) throws ServiceException;

    /**
     * 删除单个节目
     *
     * @param programId 节目主键
     * @param request   请求
     * @return 影响行数
     * @throws ServiceException
     */
    int deleteByPrimaryKey(Long programId, HttpServletRequest request) throws ServiceException;

    /**
     * 根据主键查询节目
     *
     * @param programId 节目主键
     * @return Program
     * @throws ServiceException
     */
    Program selectByPrimaryKey(Long programId);

    /**
     * 批量删除节目的终端
     *
     * @param programVersion 节目版本号
     * @param deviceCodes    终端code（多个以英文逗号隔开）
     * @param request        请求
     * @return 成功返回true, 反之false
     * @throws ServiceException
     */
    boolean batchDeleteDeviceFromProgram(String programVersion, String deviceCodes, HttpServletRequest request) throws ServiceException;

    /**
     * 根据节目版本号删除节目
     *
     * @param programVersion 节目版本号
     * @param request        请求
     * @return 影响行数
     * @throws ServiceException
     */
    int deleteByProgramVersion(String programVersion, HttpServletRequest request) throws ServiceException;

    /**
     * 修改节目添加状态
     *
     * @param programId  节目ID
     * @param addStatus  添加状态
     * @param updateTime 修改时间
     * @param request    请求
     * @return 影响行数
     * @throws ServiceException
     */
    int updateProgramAddStatus(Long programId, Integer addStatus, Long updateTime, HttpServletRequest request) throws ServiceException;

    /**
     * 创建节目
     *
     * @param cpProgramDTO 节目DTO对象
     * @param request      请求
     * @return 成功返回节目id
     * @throws ServiceException
     */
    long saveProgram(CpProgramDTO cpProgramDTO, HttpServletRequest request) throws ServiceException;

    /**
     * 编辑节目
     *
     * @param cpProgramDTO 节目数据对象
     * @param request      请求
     * @return 成功返回空字符，失败返回失败原因
     * @throws ServiceException
     */
    String updateProgram(CpProgramDTO cpProgramDTO, HttpServletRequest request) throws ServiceException;

    /**
     * 导出全部节目列表
     *
     * @param programStatus 节目状态
     * @param companyCode   商家编号
     * @param programName   节目名称
     * @param startTime     更新开始时间
     * @param endTime       更新结束时间
     * @return List<CpAllProgramExportVO>
     */
    List<CpAllProgramExportVO> allProgramListExport(Integer programStatus, String companyCode, String programName,
                                                    Long startTime, Long endTime);

    /**
     * 全部节目列表
     *
     * @param programStatus 节目状态
     * @param companyCode   商家编号
     * @param programName   节目名称
     * @param startTime     更新开始时间
     * @param endTime       更新结束时间
     * @param pageNum       当前页
     * @param pageSize      每页条数
     * @return Page<CkProgramListVO>
     */
    Page<CkProgramListVO> allProgramList(Integer programStatus, String companyCode, String programName, Long startTime,
                                         Long endTime, Integer pageNum, Integer pageSize);

    /**
     * 根据主键查询节目详情（包括场景，素材）
     *
     * @param programId 节目主键
     * @param request   请求
     * @return CpProgramDTO
     * @throws ServiceException
     */
    CpProgramDTO selectByPrimaryKeyDTO(Long programId, HttpServletRequest request) throws ServiceException;

    /**
     * 批量删除节目的终端
     *
     * @param programVersions 节目版本号(多个以英文逗号隔开)
     * @param deviceCode      终端code
     * @param request         请求
     * @return 成功返回true, 否则false
     * @throws ServiceException
     */
    boolean batchDeleteProgramFromDevice(String programVersions, String deviceCode, HttpServletRequest request) throws ServiceException;

    /**
     * 单个节目分页列表
     *
     * @param companyCode 商家代码
     * @param programName 节目名称
     * @param programId   节目ID
     * @param pageNum     当前页数
     * @param pageSize    每页条数
     * @return Page<CpSingleProgramVO>
     */
    Page<CpSingleProgramVO> singleProgramList(String companyCode, String programName, String programId, Integer pageNum, Integer pageSize);

    /**
     * 单个节目导出列表
     *
     * @param companyCode 商家编号
     * @param programId   节目ID
     * @param programName 节目主键
     * @return List<CpSingleProgramVO>
     */
    List<CpSingleProgramVO> singleProgramListExport(String companyCode, String programId, String programName);

    /**
     * 通过节目
     *
     * @param programId 节目ID
     * @param request   请求
     * @return 影响行数
     * @throws ServiceException
     */
    int approve(Long programId, HttpServletRequest request) throws ServiceException;

    /**
     * 不通过节目
     *
     * @param programId  节目ID
     * @param updateTime 更新时间
     * @param reason     不通过原因
     * @param request    请求
     * @return 影响行数
     * @throws ServiceException
     */
    int notApprove(Long programId, Long updateTime, String reason, HttpServletRequest request) throws ServiceException;

    /**
     * 根据数据状态和节目状态查询节目集合
     *
     * @param dataStatus    数据状态（0正常，1逻辑删除）
     * @param programStatus 节目状态(0：已审批，1：待审批，2：待发布，3：已过期)
     * @return List<Program>
     */
    List<Program> list(Integer dataStatus, Integer programStatus);

    /**
     * 批量更新节目为已过期
     *
     * @param versionList 到更新节目版本号集合
     * @param updateTime  更新时间
     * @param request     请求
     * @return 影响行数
     * @throws ServiceException
     */
    int batchUpdateProgramToExpired(List<String> versionList, Long updateTime, HttpServletRequest request) throws ServiceException;

    /**
     * 批量更新节目为已过期
     *
     * @param versionList 到更新节目版本号集合
     * @param updateTime  更新时间
     * @return 影响行数
     */
    int batchUpdateProgramToExpiredLocal(List<String> versionList, Long updateTime);

    /**
     * 查询节目数量（programStatus为null,查询节目总数）
     *
     * @param companyCode   商家编码
     * @param programStatus 节目状态
     * @return 节目数量
     * @throws ServiceException
     */
    Long countProgram(String companyCode, Integer programStatus) throws ServiceException;

    /**
     * 清除节目不通过原因
     *
     * @param companyCode 商家编号
     * @param programId   节目ID
     * @return 影响行数
     */
    int cleanProgramNoPassReason(String companyCode, Long programId);

    /**
     * 新增节目（空节目）
     *
     * @param programName       节目名称
     * @param programResolution 节目尺寸
     * @param programTemplateId 模板ID
     * @param loginUser         登录用户信息
     * @return 新增的节目ID
     */
    long saveProgram(String programName, String programResolution, Long programTemplateId, LoginUser loginUser);

    /**
     * 编辑节目(保存)
     *
     * @param programId         节目ID
     * @param programTemplateId 节目
     * @param json              节目数据json
     * @param loginUser         登录用户信息
     * @return 编辑结果
     */
    String updateProgram(Long programId, Long programTemplateId, String json, LoginUser loginUser);

    /**
     * 编辑节目(保存并跳转到投放设置,需要验证节目是否符合要求)
     *
     * @param programId         节目ID
     * @param programTemplateId 节目
     * @param json              节目数据json
     * @param loginUser         登录用户信息
     * @return 编辑结果
     */
    String updateProgramAndJump(Long programId, Long programTemplateId, String json, LoginUser loginUser);
}
